iT邦幫忙

2022 iThome 鐵人賽

DAY 8
0
Software Development

離開C#新手村的最後試煉系列 第 8

試煉8 - 開始練習組合技1 物件導向 + 泛型

  • 分享至 

  • xImage
  •  

開始試煉

先來看看一些專案的程式碼
SimplCommerceResult.cs
cloudscribe.SimpleContentCommandResult.cs

像這樣的 Result class 常用到的情境像是去打API後拿資料 當然打API有失敗的可能所以都會想一個處理方法
我自己用的程式碼是

public abstract class GenericResultDto<T>
{
    protected bool _isSuccess;
    public bool IsSuccess => _isSuccess;

    public bool IsFail => _isSuccess == false;

    protected string _errorMessage;
    public string ErrorMessage => _errorMessage;

    protected T _value;
    public T Value => _value;
}

public sealed class SuccessResultDto<T> : GenericResultDto<T>
{
    public SuccessResultDto(T value = default,string errorMessage = default)
    {
        _isSuccess = true;
        _value = value;
        _errorMessage = errorMessage;
    }
}

public sealed class FailResultDto<T> : GenericResultDto<T>
{
    public FailResultDto(string errorMessage = default, T value = default)
    {
        _isSuccess = false;
        _errorMessage = errorMessage;
        _value = value;
    }
}

有用一些物件導向手法讓我來說明

  1. GenericResultDto 用 abstract 是利用不能new 抽象方法的特性 但是又可以拿來當作固定的回傳類型 跟一些固定的方法可以先實做好 像是
    public bool IsFail => _isSuccess == false;
  2. 再來 SuccessResultDto 跟 FailResultDto 是想加上可讀性 如果不這樣做的話
    通常都要傳 true/false 當參數 少一個參數還可以增加可讀性
  3. sealed 因為這SuccessResultDto 跟 FailResultDto 無需在被繼承
  4. 當然要能夠通用的好辦法就是用泛型啦
  5. 可以依照自己(團隊)的習慣 處理一些細節像是SuccessResultDto跟FailResultDto跟建構子參數是相反的 成功時先放資料,失敗時先放錯誤訊息 對我來說是很直覺的

使用上的範例code

GenericResultDto<DateTime> Demo(bool isNow)
{
    if(isNow)
    {
        return new SuccessResultDto<DateTime>(DateTime.Now);
    }

    return new FailResultDto<DateTime>("some message");
}

在新手村學到的各種技巧,混合在一起就會產生不同的效果
只是通常都是停留在看都懂,遇到問題都不知道怎樣運用的階段
所以打好基礎跟找到好團隊一起下副本,就比較容易通過這階段

結束試煉

準備離開新手村時 有這樣的組合技能力 下副本時一定用的上


上一篇
試煉7 - 學會正確拋例外前,可不能離開新手村
下一篇
# 試煉9 - 四捨五入的坑踩過了嗎
系列文
離開C#新手村的最後試煉30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言